/*Tableau associatif global qui répertorie toutes les données nécessaires*/
var v = new Array();
window.addEventListener('load', initialisation, false);
window.addEventListener('unload', endOfGame, false);

function initialisation(){
	/*
	initialisation de toutes les variables concernant le joueur et le jeu
	*/
	v["joueur"] = {	ident : Math.floor(Math.random()*10000000000), 
					pseudo : null, 
                    backgroundDom : document.getElementById("player1"), 
                    backgroundPos : 0, 
					backgroundId : (Math.floor(Math.random()*3))%3, 
                    persoId: (Math.floor(Math.random()*11))%11 ,
					bSaute : false,
					hauteur : 42,
					occurSaute : -10,
                    y : 142,
                    lasty : 142,
                    onABlock : false, 
					rage:100, 
					furious:0,
                    vies : 3, ligne : 0, col : 0,
                    waitLife : false, countWaitLife : 0,
					context: document.querySelector('#canvas-joueur').getContext('2d'),
                    opacity : 1,
                    receiveNapalm: false,
					napalmX: 864,					
					fog:false,
                    fogX:880,					
					isInvincible: false,
                    invincibleTimer: 300                    
					};
	/*Infos concernant l'adversaire*/
	v["joueur-dist"] = { ident : null, 
					pseudo : null, 
                    backgroundDom : document.getElementById("player-dist"), 
                    backgroundPos : 0, 
                    persoId : 0,
					bSaute : false,
					hauteur : 42,
					onABlock : false, 
                    y : 142,
                    lasty : 142,
					rage:100, 
					furious:0,
					occurSaute : -10,
                    vies : 3, ligne : 0, col : 0,
                    waitLife : false, countWaitLife : 0,
					context: document.querySelector('#canvas-joueur-dist').getContext('2d'),
                    opacity: 1,
                    receiveNapalm: false,
					napalmX: 864,
					fog:false,
                    fogX:880,
					isInvincible: false,
                    invincibleTimer: 300                    
					};
	/*Données de la bulle de discution*/
	v["bulle"] = { 	dom : document.getElementById("bulle"), 
					indiceOpacity : 0, 
					bNewMessage: false, 
					bVisible:false,
					b1Trans: false, 
					b2Trans: false
					};
        if(c["dyn"]){
            v["joueur"].pseudo = c["me"].pseudo;
            v["joueur-dist"].pseudo = c["op"].pseudo;
            v["joueur"].ident = c["me"].hash;
            v["joueur-dist"].ident = c["op"].hash;
            v["joueur"].persoId = c["me"].perso;
            v["joueur-dist"].perdoId = c["op"].perso;
        } 
	
	v["bulle"].dom.style.opacity = 0;
	v["joueur"].backgroundDom.style.backgroundImage = "url('/files/images/background"+v["joueur"].backgroundId+".png')";
   
	v["timerCount"] = 0;
	
	/*données concernants les items utilisables par les joueurs*/
    v["weapon"] = new Object();
    v["weapon"].FireBullet = {"dom" : new Object(), "enable" : false, "x" : 0, "y" : 0, "number" : 5 };
    v["weapon"].Shield = { "enable" : false, "number": 5 };
    v["weapon"].Heal = { "enable" : false, "number": 5 };
    v["weapon"].Special = { "number": 4};
    v["weapon"].Fog = { "number": 1};
   
    v["weapon-dist"] = new Object();
    v["weapon-dist"].FireBullet = {"dom" : new Object(), "enable" : false, "x" : 0, "y" : 0, "number" : 5 };
    v["weapon-dist"].Shield = { "enable" : false, "number": 5 };
    v["weapon-dist"].Heal = { "enable" : false, "number": 5 };
    v["weapon-dist"].Special = { "number": 4};
    v["weapon-dist"].Fog = { "number": 1};
    
	/*données concernants les attaques reçus par un joueur*/
	
    v["weapon-recus"] = new Array();
    v["weapon-recus-dist"] = new Array();

	/*données concernants les obstacles sur les timelines des joueurs*/
    v["item"] = new Array();
    v["item-dist"] = new Array();

    v["constantes"] = {"background" : new Array(2091,3215), "posX": 180, "joueurH" : 40 , "joueurW": 30, "blockW" : 16, "blockH":16, "posYinit":142};
    v["constantes"].focusOnMessage = false;
    v["constantes"].indiceAffichage = 2;
    v["constantes"].bNewMessage = false;
    v["constantes"].incrementeWaiting = 0;
    v["constantes"].displayItemDist = false;
    v["constantes"].matrix = new Array();
    v["constantes"].isLoading = {"loading": true, "loadingX": 250, "opacity": 1.00, "stop": false};
    v["constantes"].chrono = {"sec":0, "min":0};
    v["constantes"].noJump = false;
    v["constantes"].start = false;
	
	/*données concernants les informations sur les patterns chargés en aléatoires pour chaque joueurs*/
	v["pattern"] = new Array();
    v["pattern-dist"] = new Array();
	
	initItems();
	initPattern();
	
	/*définition des addEventListerner pour la gestion des interractions avec le joueur*/
	
    if(!c["dyn"]){
	    document.getElementById("pseudo_local").addEventListener("change", listenPseudoLocal, false);
	    document.getElementById("pseudo_distant").addEventListener("change", listenPseudoDistant, false);
    }
	document.getElementById("player1").addEventListener("click", sauterLocal, false);
	document.getElementById("body").addEventListener("keydown", keyDown, false);
	document.getElementById("message").addEventListener("keydown", function(e){
        if(e.keyCode == 13){
            if(c["watch"]){
                ajoutTextChat(c["watch"].pseudo, document.getElementById("message").value);
            } else {
                ajoutTextChat(v["joueur"].pseudo, document.getElementById("message").value);
            }
                document.getElementById("message").value = "";
        }
	}, false);
	document.getElementById("envoyer").addEventListener("click", function(){
		ajoutTextChat(v["joueur"].pseudo, document.getElementById("message").value);
        document.getElementById("message").value = "";
	}, false);
    if(!c["watch"]){
        document.getElementById('firebar1').addEventListener("click", function(){
            ShotFireBullet();
            v["constantes"].noJump = true;
        }, false);
        document.getElementById('nb-firebullet-joueur').addEventListener("click", function(){
            ShotFireBullet();
            v["constantes"].noJump = true;
        }, false);
        document.getElementById('teleport1').addEventListener("click", function(){
            GetShield("joueur");
            v["constantes"].noJump = true;
                PUBNUB.publish({             // SEND A MESSAGE.
                    channel : c["channel"].saut,
                    message : {
                            "ident" : v["joueur"].ident,
                            "pseudo" : v["joueur"].pseudo,
                            "vie": v["joueur"].vies,
                            "rage":v["joueur"].rage,
                            "furious":v["joueur"].furious,
                            "isShield":v["weapon"].Shield.enable,
                            "nbShield":v["weapon"].Shield.number,
                            "nbBullet":v["weapon"].FireBullet.number,
                            "nbHeal":v["weapon"].Heal.number,
                            "nbSpecial":v["weapon"].Special.number,
                            "type" : "ShieldOn"
                            }
                });
        }, false);
        document.getElementById('nb-teleport-joueur').addEventListener("click", function(){
            GetShield("joueur");
            v["constantes"].noJump = true;
                PUBNUB.publish({             // SEND A MESSAGE.
                    channel : c["channel"].saut,
                    message : {
                            "ident" : v["joueur"].ident,
                            "pseudo" : v["joueur"].pseudo,
                            "vie": v["joueur"].vies,
                            "rage":v["joueur"].rage,
                            "furious":v["joueur"].furious,
                            "isShield":v["weapon"].Shield.enable,
                            "nbShield":v["weapon"].Shield.number,
                            "nbBullet":v["weapon"].FireBullet.number,
                            "nbHeal":v["weapon"].Heal.number,
                            "nbSpecial":v["weapon"].Special.number,
                            "type" : "ShieldOn"
                            }
                });
        }, false);
        document.getElementById('heal1').addEventListener("click", function(){
            GetHealth();
            v["constantes"].noJump = true;
        }, false);
        document.getElementById('nb-heal-joueur').addEventListener("click", function(){
            GetHealth();
            v["constantes"].noJump = true;
        }, false);
        document.getElementById('special1').addEventListener("click", function(){
            if(v["weapon"].Special.number>0 && !v["joueur"].isInvincible){
                v["joueur"].isInvincible = true;
                v["joueur"].hauteur = 10;
                v["joueur"].occurSaute = determineNear_occurSaute(v["joueur"].y, 10);
                v["constantes"].noJump = true;
                v["weapon"].Special.number --;
                document.getElementById('nb-special-joueur').innerHTML = 'x' + v["weapon"].Special.number;
                pushInvincible();
            }
        }, false);
        document.getElementById('nb-special-joueur').addEventListener("click", function(){
            if(v["weapon"].Special.number>0 && !v["joueur"].isInvincible){
                v["joueur"].isInvincible = true;
                v["joueur"].hauteur = 10;
                v["joueur"].occurSaute = determineNear_occurSaute(v["joueur"].y, 10);
                v["constantes"].noJump = true;
                v["weapon"].Special.number --;
                document.getElementById('nb-special-joueur').innerHTML = 'x' + v["weapon"].Special.number;
                pushInvincible();
            }
        }, false);
    }
	document.getElementById("message").addEventListener("focus", function(){
		v["constantes"].focusOnMessage = true;
	}, false);
	document.getElementById("message").addEventListener("blur", function(){
		v["constantes"].focusOnMessage = false;
	}, false);
    
    $(window).unload( function () {     if(!c["watch"] && v["timer"] != "stop"){
        PUBNUB.publish({             // SEND A MESSAGE.
            channel : c["channel"].saut,
            message : {
                    "ident" : v["joueur"].ident,
                    "pseudo" : v["joueur"].pseudo,
                    "type" : "leave"
            }
        });
        alert("Vous êtes pénalisé pour avoir quitter la partie !");
    } } );
    
    document.getElementById('pseudo-joueur').innerHTML = v["joueur"].pseudo;
    if(v["joueur-dist"].pseudo != null){document.getElementById('pseudo-joueur-dist').innerHTML = v["joueur-dist"].pseudo;}
    else{document.getElementById('pseudo-joueur-dist').innerHTML = "Loading";}
}

function listenPseudoLocal()
{
	/*enregistrement du pseudo d'un joueur en mode non dynamique*/
    v["joueur"].pseudo = document.getElementById("pseudo_local").value;
}
function listenPseudoDistant()
{
	/*enregistrement du pseudo d'un joueur-dist en mode non dynamique*/
    v["joueur-dist"].pseudo = document.getElementById("pseudo_distant").value;
    v["joueur-dist"].ident = null;
}
function keyDown(e)
{
    if(e.keyCode == 13){ 
            if(!v["constantes"].focusOnMessage){ document.getElementById("message").focus();}
            else{ document.getElementById("message").blur();}
    }
    if(!c["watch"]){
        if(e.keyCode == 32 && !v["constantes"].focusOnMessage){sauterLocal();}
        else if((e.keyCode == 103 || e.keyCode == 49) && !v["constantes"].focusOnMessage){
                ShotFireBullet();
        }
        else if((e.keyCode == 104 || e.keyCode == 50) && !v["constantes"].focusOnMessage){
                GetShield("joueur");
                PUBNUB.publish({             // SEND A MESSAGE.
                    channel : c["channel"].saut,
                    message : {
                            "ident" : v["joueur"].ident,
                            "pseudo" : v["joueur"].pseudo,
                            "vie": v["joueur"].vies,
                            "rage":v["joueur"].rage,
                            "furious":v["joueur"].furious,
                            "isShield":v["weapon"].Shield.enable,
                            "nbShield":v["weapon"].Shield.number,
                            "nbBullet":v["weapon"].FireBullet.number,
                            "nbHeal":v["weapon"].Heal.number,
                            "nbSpecial":v["weapon"].Special.number,
                            "type" : "ShieldOn"
                            }
                });
        }
        else if((e.keyCode == 105 || e.keyCode == 51) && !v["constantes"].focusOnMessage){
                GetHealth();
        }
        else if(e.keyCode == 53 && !v["constantes"].focusOnMessage){
                if(v["weapon"].Special.number>0 && !v["joueur"].isInvincible){
                    v["joueur"].isInvincible = true;
                    v["joueur"].hauteur = 10;
                	v["joueur"].occurSaute = determineNear_occurSaute(v["joueur"].y, 10);
                    v["weapon"].Special.number --;
                    document.getElementById('nb-special-joueur').innerHTML = 'x' + v["weapon"].Special.number;
                    pushInvincible();
                }
        }
        else if(e.keyCode == 100 && !v["constantes"].focusOnMessage){
                loserage("joueur",10);
                losefurious("joueur",10);
        }
        else if((e.keyCode == 101 || e.keyCode == 90) && !v["constantes"].focusOnMessage){
                gainrage("joueur",10);
                gainfurious("joueur",10);
        }
        else if((e.keyCode == 107 || e.keyCode == 54) && !v["constantes"].focusOnMessage && v["joueur"].furious >=100){
                GetXSpecial("joueur");            
        }
        else if(e.keyCode == 52 && !v["constantes"].focusOnMessage){
                sendFog();
        }
    }
}

function endOfGame(){
	/*détection de l'évènement unload pour détecter le départ précipité d'un joueur*/
    if(!c["watch"] && v["timer"] != "stop"){
        PUBNUB.publish({             // SEND A MESSAGE.
            channel : c["channel"].saut,
            message : {
                    "ident" : v["joueur"].ident,
                    "pseudo" : v["joueur"].pseudo,
                    "type" : "leave"
            }
        });
        alert("Vous êtes pénalisé pour avoir quitter la partie !");
    }
}